package br.com.foxinline.servico;

import br.com.foxinline.enums.Relatorio;
import br.com.foxinline.generico.ServicoGenerico;
import br.com.foxinline.modelo.Coordenada;
import br.com.foxinline.modelo.HistoricoRevisaoAlinhamento;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.modelo.Requerimento;
import br.com.foxinline.modelo.RevisaoAlinhamento;
import br.com.foxinline.util.ConverterStringDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author elyjunior
 */
@Stateless
public class RevisaoAlinhamentoServico extends ServicoGenerico<RevisaoAlinhamento> {

    @EJB
    HistoricoRevisaoAlinhamentoServico historicoRevisaoAlinhamentoServico;

    public RevisaoAlinhamentoServico() {
        super(RevisaoAlinhamento.class);
    }

    public List<RevisaoAlinhamento> findRevisaoAlinhamento(RevisaoAlinhamento revisaoAlinhamento) {
        String sql = "SELECT r FROM RevisaoAlinhamento r WHERE r.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", revisaoAlinhamento.getId());
        return (List<RevisaoAlinhamento>) query.getResultList();
    }

    public List<Proprietario> lstProprietario(Imovel imovel) {
        String sql = "SELECT p FROM Imovel i JOIN i.proprietarios p WHERE i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Proprietario>) query.getResultList();
    }

    public List<Coordenada> lstCoordenadas(Imovel imovel) {
        String sql = "SELECT c FROM Imovel i JOIN i.coordenadas c WHERE i.id  = :id ORDER BY c.id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", imovel.getId());
        return (List<Coordenada>) query.getResultList();
    }

    public void relatorioRevisaoAlinhamento(HashMap parametros, HistoricoRevisaoAlinhamento historicoRevisaoAlinhamento) {

        RevisaoAlinhamento revisaoAlinhamento = null;
        revisaoAlinhamento = historicoRevisaoAlinhamento.getRevisaoAlinhamento();
        List<RevisaoAlinhamento> revisaoAlinhamentos = findRevisaoAlinhamento(revisaoAlinhamento);

        for (RevisaoAlinhamento revAlinhamento : revisaoAlinhamentos) {
            Imovel imovel = revAlinhamento.getImovel();
            System.out.println(imovel);
            List<Proprietario> proprietarios = lstProprietario(imovel);
            imovel.setProprietarios(proprietarios);

            StringBuffer sbProprietario = new StringBuffer();
            for (Proprietario p : imovel.getProprietarios()) {
                sbProprietario.append(p.getNome());
                sbProprietario.append(" , ");
            }
            if (sbProprietario.length() != 0) {
                sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                if (imovel.getProprietarios().size() > 1) {
                    int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                    sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e ");
                }
            }
            System.out.println(sbProprietario);
            revAlinhamento.setProprietarioField(" " + sbProprietario);

            revAlinhamento.setLocalImovelField(" " + imovel.getEnderecoImovel().getLogradouro() + " Número " + imovel.getEnderecoImovel().getNumero() + ", Bairro " + imovel.getEnderecoImovel().getBairro());
            revAlinhamento.setFrenteNumeroField(" " + String.valueOf(revAlinhamento.getFrente()) + " m");
            revAlinhamento.setFundoNumeroField(" " + String.valueOf(revAlinhamento.getFundo()) + " m");
            revAlinhamento.setLadoDireitoNumeroField(" " + String.valueOf(revAlinhamento.getLadoDireito()) + " m");
            revAlinhamento.setLadoEsquerdoNumeroField(" " + String.valueOf(revAlinhamento.getLadoEsquerdo()) + " m");
            revAlinhamento.setAreaTotalField(" " + String.valueOf(revAlinhamento.getAreaTotal()) + " m²");
            String textoDescricaoField = "      Em atendimento ao despacho da Sra. Secretária da Regularização Fundiária e Habitação, foi efetuado a Revisão de Demarcação"
                    + " e Alinhamento de um terreno situado na Zona Urbana da cidade, no quarteirão formado pela  " + imovel.getEnderecoImovel().getLogradouro() + " "
                    + imovel.getEnderecoImovel().getNumero() + "," + imovel.getEnderecoImovel().getBairro() + ", com os seguintes limitantes e confrontações"
                    + " conforme Matrícula " + revAlinhamento.getMatricula() + ", Livro " + revAlinhamento.getLivro() + ", Fls. n " + revAlinhamento.getFolha() + " datada " + ConverterStringDate.escreverData(revAlinhamento.getDatada());

            revAlinhamento.setDescricaoField(textoDescricaoField);

            if (imovel.getFrente()
                    != null && !imovel.getFrente().isEmpty() && imovel.getFrenteRua() != null && !imovel.getFrenteRua().isEmpty() && imovel.getFrenteMedindo() != null && !imovel.getFrenteMedindo().equals("")) {
                String texto_frente = "Para o " + imovel.getFrente() + " limitando-se com " + imovel.getFrenteRua() + " medindo " + imovel.getFrenteMedindo()+" m";
                revAlinhamento.setFrenteTextoField(texto_frente);
            } else {
                revAlinhamento.setFrenteTextoField("");
            }

            if (imovel.getFundo()
                    != null && !imovel.getFundo().isEmpty() && imovel.getFundoRua() != null && !imovel.getFundoRua().isEmpty() && imovel.getFundoMedindo() != null && !imovel.getFundoMedindo().equals("")) {

                String texto_fundo = "Para o " + imovel.getFundo() + " limitando-se com " + imovel.getFundoRua() + " medindo " + imovel.getFundoMedindo()+" m";
                revAlinhamento.setFundoTextoField(texto_fundo);
            } else {
                revAlinhamento.setFundoTextoField("");
            }

            if (imovel.getLadoDireito()
                    != null && !imovel.getLadoDireito().isEmpty() && imovel.getLadoDireitoRua() != null && !imovel.getLadoDireitoRua().isEmpty() && imovel.getLadoDireitoMedindo() != null && !imovel.getLadoDireitoMedindo().equals("")) {

                String texto_direito = "Para o " + imovel.getLadoDireito() + " limitando-se com " + imovel.getLadoDireitoRua() + " medindo " + imovel.getLadoDireitoMedindo()+" m";
                revAlinhamento.setLadoDireitoTextoField(texto_direito);
            } else {
                revAlinhamento.setLadoDireitoTextoField("");
            }

            if (imovel.getLadoEsquerdo()
                    != null && !imovel.getLadoEsquerdo().isEmpty() && imovel.getLadoEsquerdoRua() != null && !imovel.getLadoEsquerdoRua().isEmpty() && imovel.getLadoEsquerdoMedindo() != null && !imovel.getLadoEsquerdoMedindo().equals("")) {

                String texto_esquerdo = "Para o " + imovel.getLadoEsquerdo() + " limitando-se com " + imovel.getLadoEsquerdoRua() + " medindo " + imovel.getLadoEsquerdoMedindo()+" m";
                revAlinhamento.setLadoEsquerdoTextoField(texto_esquerdo);
            } else {
                revAlinhamento.setLadoEsquerdoTextoField("");
            }


            if (revAlinhamento.getInvasao() != null && revAlinhamento.getInvasao()) {
                revAlinhamento.setTextoInvasao("HÁ INVASÃO");
            } else {
                revAlinhamento.setTextoInvasao("NÃO HÁ INVASÃO");
            }

            revAlinhamento.setDescricaoPavimentacaoField(revAlinhamento.getDescricaoPavimentacao());

//            System.err.println(
//                    "Paramentro = " + parametros);
//            System.err.println(revisaoAlinhamentos);
            RelatorioServico.genReport(parametros, revisaoAlinhamentos, Relatorio.REVISAOALINHAMENTO);
        }
    }
    
    
    public void relatorioRevisaoAlinhamento(HashMap parametros, RevisaoAlinhamento revisao) {

        
          List<RevisaoAlinhamento> revAlinhamentos = new ArrayList<RevisaoAlinhamento>();
//        for (RevisaoAlinhamento revAlinhamento : revisaoAlinhamentos) {
            Imovel imovel = revisao.getImovel();
//            System.out.println(imovel);
            List<Proprietario> proprietarios = lstProprietario(imovel);
            imovel.setProprietarios(proprietarios);
 
            StringBuffer sbProprietario = new StringBuffer();
            for (Proprietario p : imovel.getProprietarios()) {
                sbProprietario.append(p.getNome());
                sbProprietario.append(" , ");
            }
            if (sbProprietario.length() != 0) {
                sbProprietario.delete(sbProprietario.length() - 3, sbProprietario.length());
                if (imovel.getProprietarios().size() > 1) {
                    int tam = imovel.getProprietarios().get(imovel.getProprietarios().size() - 1).getNome().length();
                    sbProprietario.replace(sbProprietario.length() - tam - 2, sbProprietario.length() - tam - 1, "e ");
                }
            }
            System.out.println(sbProprietario); 
            revisao.setProprietarioField(" "+ sbProprietario);

            revisao.setLocalImovelField(" "+ imovel.getEnderecoImovel().getLogradouro()+" Número "+ imovel.getEnderecoImovel().getNumero()+", Bairro "+ imovel.getEnderecoImovel().getBairro());
            revisao.setFrenteNumeroField(" "+ String.valueOf(revisao.getFrente())+" m");
            revisao.setFundoNumeroField(" "+ String.valueOf(revisao.getFundo())+" m");
            revisao.setLadoDireitoNumeroField(" "+ String.valueOf(revisao.getLadoDireito())+" m");
            revisao.setLadoEsquerdoNumeroField(" "+ String.valueOf(revisao.getLadoEsquerdo())+" m");
            revisao.setAreaTotalField(" "+ String.valueOf(revisao.getAreaTotal())+" m²");
            String textoDescricaoField ="      Em atendimento ao despacho da Sra. Secretária da Regularização Fundiária e Habitação, foi efetuado a Revisão de Demarcação"
                    + " e Alinhamento de um terreno situado na Zona Urbana da cidade, no quarteirão formado pela  "+imovel.getEnderecoImovel().getLogradouro()+" "
                    + imovel.getEnderecoImovel().getNumero()+","+imovel.getEnderecoImovel().getBairro()+", com os seguintes limitantes e confrontações"
                    + " conforme Matrícula "+revisao.getMatricula()+", Livro "+revisao.getLivro()+", Fls. n "+revisao.getFolha() +" datada "+ ConverterStringDate.escreverData(revisao.getDatada());
                   
            revisao.setDescricaoField(textoDescricaoField);
            
            if (imovel.getFrente()
                    != null && !imovel.getFrente().isEmpty() && imovel.getFrenteRua() != null && !imovel.getFrenteRua().isEmpty() && imovel.getFrenteMedindo() != null && !imovel.getFrenteMedindo().equals("")) {
                String texto_frente = "Para o " + imovel.getFrente() + " limitando-se com " + imovel.getFrenteRua() + " medindo " + imovel.getFrenteMedindo()+" m";
                revisao.setFrenteTextoField(texto_frente);
            } else {
                revisao.setFrenteTextoField("");
            }

            if (imovel.getFundo()
                    != null && !imovel.getFundo().isEmpty() && imovel.getFundoRua() != null && !imovel.getFundoRua().isEmpty() && imovel.getFundoMedindo() != null && !imovel.getFundoMedindo().equals("")) {

                String texto_fundo = "Para o " + imovel.getFundo() + " limitando-se com " + imovel.getFundoRua() + " medindo " + imovel.getFundoMedindo()+" m";
                revisao.setFundoTextoField(texto_fundo);
            } else {
                revisao.setFundoTextoField("");
            } 

            if (imovel.getLadoDireito()
                    != null && !imovel.getLadoDireito().isEmpty() && imovel.getLadoDireitoRua() != null && !imovel.getLadoDireitoRua().isEmpty() && imovel.getLadoDireitoMedindo() != null && !imovel.getLadoDireitoMedindo().equals("")) {

                String texto_direito = "Para o " + imovel.getLadoDireito() + " limitando-se com " + imovel.getLadoDireitoRua() + " medindo " + imovel.getLadoDireitoMedindo()+" m";
                revisao.setLadoDireitoTextoField(texto_direito);
            } else {
                 revisao.setLadoDireitoTextoField("");
            }

            if (imovel.getLadoEsquerdo()
                    != null && !imovel.getLadoEsquerdo().isEmpty() && imovel.getLadoEsquerdoRua() != null && !imovel.getLadoEsquerdoRua().isEmpty() && imovel.getLadoEsquerdoMedindo() != null && !imovel.getLadoEsquerdoMedindo().equals("")) {

                String texto_esquerdo = "Para o " + imovel.getLadoEsquerdo() + " limitando-se com " + imovel.getLadoEsquerdo() + " medindo " + imovel.getLadoEsquerdo()+" m";
                revisao.setLadoEsquerdoTextoField(texto_esquerdo);
            } else {
                revisao.setLadoEsquerdoTextoField("");
            }

            
            if(revisao.getInvasao() != null && revisao.getInvasao()){
                revisao.setTextoInvasao("HÁ INVASÃO");
            }else{
                revisao.setTextoInvasao("NÃO HÁ INVASÃO");
            }
            
            revisao.setDescricaoPavimentacaoField(revisao.getDescricaoPavimentacao());
            
//            System.err.println(
//                    "Paramentro = " + parametros);
//            System.err.println(revisaoAlinhamentos);
            revAlinhamentos.add(revisao);
            RelatorioServico.genReport(parametros, revAlinhamentos, Relatorio.REVISAOALINHAMENTO);
        } 
    
    
     public RevisaoAlinhamento getRevisaoAlinhamentoRequerimento(Requerimento req) {
        RevisaoAlinhamento revisaoAlinhamento;
        String sql = "SELECT a FROM RevisaoAlinhamento a JOIN a.requerimento r WHERE r.id = :id ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", req.getId());

        try {
            revisaoAlinhamento = (RevisaoAlinhamento) query.getResultList().get(0);

        } catch (NoResultException nr) {
            return null;
        } catch (NonUniqueResultException nre) {
            return null;
        } catch (Exception e) {
            return null;
        }

        return revisaoAlinhamento;
    }
    
    
    
    
}
